# 作用域
# 全局变量：函数外部的变量，整个文件都有效
from tkinter.font import names

a = 100
def test1():
    print(a)
def test2():
    a = 120
    print(a)
print(f"调用函数前a的值:{a}")
test1()
test2()
print(f"调用函数后a的值:{a}")
# a的值没有被覆盖是因为函数内部如果使用变量，会先从函数内部找，有的话就直接使用，没有会到函数外面去找

# 局部变量
# 函数内部定义的变量，从定义位置开始到函数定义结束位置有效

# 在函数内部修改全局变量的值，可以使用global关键字

def test3():
    global name
    name = 12
    name += 1
    print(name)

def test4():
    print(name)

test3()
print(name)


# nonlocal
# 用来声明外层局部变量，只能在嵌套函数中使用，在外部函数先进行声明，内部函数进行nonlocal声明
a = 10
def outer():
    a = 5
    def inner():
        a = 20
        def inner2():
            nonlocal a
            a = 30
            print(f"inner2()中a的值:{a}")
        inner2()
        print(f"inner()中的a的值:{a}")
    inner()
    print(f"outer()中a的值:{a}")
outer()

# 匿名函数
# 函数名 = lambda 形参 : 返回值
# 普通函数
def add(a,b):
    return a+b
print(add(10,20))

add1 = lambda a,b:a+b
print(add1(10,20))

# lambda 参数形式
# 无参数
funa = lambda : "abc"
print(funa())
# 一个参数
funb = lambda name : name
print(funb("hello"))

# 内置函数
import builtins
# 大写字母开头一般是内置常量名，小写字母开头一般是内置函数名
print(dir(builtins))
# abs（） 绝对值
print(abs(-12.3))
# sum() 求和
print(sum([1,2,3]))
# min()最小值
print(min(1,2,43,4))
print(min(-8,5,key=abs))
# max() 最大值

#zip 可迭代对象作为参数，将对象中对应的元素打包成一个个元组
li = [1,2,3,4,5]
l2 = ['a','b','c','d']
print(zip(li,l2))
for item in zip(li,l2):
    print(item)
print(list(zip(li,l2)))

# map
li = [1,2,3,4,5]
def func(x):
    return x*2
mp = map(func,li)
print(list(mp),type(mp))

#reduce
from functools import reduce
sum = reduce(lambda x,y:x+y,li,100)
print(sum)

# 拆包
li = [1,2,3,4]
a,b,c,d = li
print(a,b,c,d)
a,*b = li
print(a,b)

dict = {'a1':1,'b1':2,'c1':3}
a,b,c = dict
print(a,b,c)